#include "WaterPump.h"
#include "timer.h"
#include "RTC.h"
#include "key.h"
#include "LED.h"
u8  _Mode;  //记录当前水泵工作模式

//水泵芯片是反向处理，低电平开启，高电平关闭
void Waterpump_Init(void)
{
	//IN_PUMP水泵 控制初始化 
	 GPIO_Config_T gpioConfig;

   RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA | RCM_AHB_PERIPH_GPIOB);

   gpioConfig.pin =  GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_6;
   gpioConfig.mode = GPIO_MODE_OUT;
   gpioConfig.outtype = GPIO_OUT_TYPE_PP;
   gpioConfig.speed = GPIO_SPEED_50MHz;
   gpioConfig.pupd = GPIO_PUPD_NO;
   GPIO_Config(GPIOA, &gpioConfig);
	
	 gpioConfig.mode = GPIO_MODE_OUT;          //配置 PUPM_POWER
	 gpioConfig.pin = GPIO_PIN_15; 
   gpioConfig.outtype = GPIO_OUT_TYPE_PP;
   gpioConfig.speed = GPIO_SPEED_50MHz;
   gpioConfig.pupd = GPIO_PUPD_NO;
	 GPIO_Config(GPIOB, &gpioConfig);
	
	 GPIO_SetBit(GPIOB,GPIO_PIN_15);   //水泵MOTOR 关
		GPIO_ClearBit(GPIOA,GPIO_PIN_12);   //水泵
	 GPIO_ClearBit(GPIOA,GPIO_PIN_8);   //UV 开
	
           	//  水泵状态初始化
	 gpioConfig.pin = GPIO_PIN_1|GPIO_PIN_2;
	 gpioConfig.mode = GPIO_MODE_IN;
	 gpioConfig.pupd = GPIO_PUPD_NO;  
	 GPIO_Config(GPIOB, &gpioConfig);      //浮空输入
	 
	       //霍尔开关初始化
	 gpioConfig.pin = GPIO_PIN_4|GPIO_PIN_5;
	 gpioConfig.mode = GPIO_MODE_IN;
	 gpioConfig.pupd = GPIO_PUPD_NO;  
	 GPIO_Config(GPIOA, &gpioConfig);      //浮空输入
	 
}


void PUMP_WATERPUR(u8 vall)          //净水开关
{
		if(vall == 0)
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_6,Bit_RESET);
		else
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_6,Bit_SET);
}


void PUMP_POWER(u8 vall)              //水泵开关
{
		if(vall == 0)
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_12,Bit_SET);
		else
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_12,Bit_RESET);
}



void PUMP_MOTOR(u8 vall)            //水泵开关
{
		if(vall == 0)
		{
			GPIO_WriteBitValue(GPIOB,GPIO_PIN_15,Bit_SET);
		}
		else
			GPIO_WriteBitValue(GPIOB,GPIO_PIN_15,Bit_RESET);
}


void PUMP_UV(u8 vall)               //UV灯开关
{
		if(vall == 0)
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_8,Bit_SET);
		else
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_8,Bit_RESET);
}


void PUMP_2GEAR(u8 vall)             //2档开关
{
		if(vall == 0)
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_11,Bit_SET);
		else
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_11,Bit_RESET);
}


void PUMP_3GEAR(u8 vall)             //3档开关
{
		if(vall == 0)
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_10,Bit_SET);
		else
			GPIO_WriteBitValue(GPIOA,GPIO_PIN_10,Bit_RESET);
}




uint8_t PUMP_Read(void)           //读取水泵状态
{	
	static	u8 temp = pump_right;
	if((OUT1_PUMP == 1)&&(OUT2_PUMP == 0))
	{
		temp = pump_shortwater; 		//缺水
	}
	else if((OUT1_PUMP == 0)&&(OUT2_PUMP == 1))
	{	
		temp = pump_right;                //堵转
	}
	else if((OUT1_PUMP == 1)&&(OUT2_PUMP == 1))   //通讯故障
	{	
		temp = pump_Stall;                //堵转
	}
	else
	{
		temp = pump_right;                 //正常
	}
//	printf("%d  %d \r\n",OUT1_PUMP,OUT2_PUMP);
	return temp;
}


u8 pump_stop_flag = 0;
void Cheak_PUMP(void)
{
static	u8 stat_pump_read;
	stat_pump_read	= PUMP_Read();
	if(stat_pump_read == pump_shortwater)  //缺水
	{
		pump_stop_flag =1;
	 mcu_dp_fault_update(DPID_ALARM_INFO,4); //故障型数据上报;
	}
	else if(stat_pump_read == pump_Stall)    //堵转
	{
		pump_stop_flag = 1;
	 mcu_dp_fault_update(DPID_ALARM_INFO,3); //故障型数据上报;
	}
	else 
	{
		pump_stop_flag = 0;
	}

}

/**************水泵停止********************/
void PUMP_stop(void)
{
			PUMP_POWER(1);
			PUMP_MOTOR(0);
			PUMP_UV(0);
			PUMP_WATERPUR(0);  //净水关
}



/*****************判断两个HALL信号*********************************************************************************************/
uint8_t HALL_Read(void)           //读取HALL信号
{	
	static	u8 HALL_Val =  _HALL_NULL;
	if((DRINK_HALL == 1)&&(FILTER_HALL == 0))
	{
			HALL_Val = _HALL_FILTER;
		mcu_dp_fault_update(DPID_ALARM_INFO, 6); //缺少饮水盘;
			printf("FILTER_HALL\r\n");
	}
	else if((DRINK_HALL == 0)&&(FILTER_HALL == 1))
	{
			HALL_Val = _HALL_DRINK;
			mcu_dp_fault_update(DPID_ALARM_INFO,7); //缺少;
			printf("DRINK_HALL\r\n");  
	}
	else if((DRINK_HALL == 1)&&(FILTER_HALL == 1))
	{
			HALL_Val = _HALL_ALL;
			mcu_dp_fault_update(DPID_ALARM_INFO,6); //故障型数据上报;
			mcu_dp_fault_update(DPID_ALARM_INFO,7); //故障型数据上报;
			printf ("DRINK_HALL  and FILTER_HALL \r\n");
	}
	else
	{
			HALL_Val =  _HALL_NULL; 
	}
		return HALL_Val;
}

    


u8 HALL_flag = 0;
/******************霍尔检测**********************/
void HALL_Cheek(void)
{
	if(HALL_Read() == _HALL_NULL)   //检测霍尔
	{
		LED_Control(1);
		Key_button();  
		HALL_flag = 1;                //用来称重
	}
	else
	{	
		LED_Blink();
		PUMP_MOTOR(0); 
		PUMP_WATERPUR(0);  //净水关
		HALL_flag = 0;                //用来测重
		Red_Blink();
	}
}

/************************************************************
//	*	函数名称： PUMP_continuity()
//	* 功能    ： 持续出水
//	*	参数    ： 无 
//	*	返回值  :  无
************************************************************/

void PUMP_continuity(void)
{
			PUMP_POWER(1);  //水泵开
			PUMP_MOTOR(1);
			PUMP_UV(1);	
			_Mode = _pump_continuity;
}

/************************************************************
//	*	函数名称： PUMP_OFF()
//	* 功能    ： 关闭水泵
//	*	参数    ： 无 
//	*	返回值  :  无
************************************************************/
void PUMP_OFF(void)
{
			PUMP_POWER(1);  //水泵关
			PUMP_MOTOR(0); 
	_Mode = _pump_NULL;
}

/************************************************************
//	*	函数名称： PUPM_interval()
//	* 功能    ： 间歇出水
//	*	参数    ： on_time ：水泵打开时间  stop_time：水泵关闭时间        单位min
//	*	返回值  :  无
************************************************************/
static u8 PUMP_MOTOR_flag = 0;   //间歇时间标志位
void PUPM_interval(u8 on_time,u8 stop_time)    //间歇模式
{	
	if(PUMP_MOTOR_flag == 0)
	{
			PUMP_POWER(1);
			PUMP_MOTOR(1);       //水泵开
		if(Pump_tick >=on_time*60)       
		{
			Pump_tick = 0;
			PUMP_MOTOR_flag = 1;
		}
	}
	else
	{
		PUMP_POWER(1);
		PUMP_MOTOR(0);       //水泵关
		if(Pump_tick >=stop_time*60)
		{
			PUMP_MOTOR_flag = 0;
			Pump_tick = 0;
		}
	}
	
	_Mode = _pump_interval;
}


u16 report_time = 1800;
/**************记录上次工作模式************************/
void Record_Mode(void)
{
	if(report_time>=3)
	{
		mcu_dp_enum_update(DPID_CLEAN_STATUS,0); //清洗失败上报;
	}
			if(_Mode == _pump_continuity)  //上次为持续出水模式
			{
				key_mach_flag =continuity_Mode;
			}
			else if(_Mode == _pump_interval)  //上次为间歇模式
			{
				key_mach_flag =interval_Mode;
			}
			else 
			{
				Key_stat = OFF_state;        //其他情况为关机
			}
			
}

/************************************************************
//	*	函数名称： Pump_clear()
//	* 功能    ： 清洗模式
//	*	参数    ： 无
//	*	返回值  :  无
************************************************************/

void Pump_clear(u8 Clear_time)
{

	PUMP_POWER(1);  //水泵开
	PUMP_MOTOR(1); 
	PUMP_UV(0);
	PUMP_WATERPUR(0);  //净水关
	if(Clear_tick >=Clear_time*60)
		{	
			Clear_tick = 0;
			PUMP_MOTOR_flag = 0;  //间歇模式标志位
			mcu_dp_enum_update(DPID_CLEAN_STATUS,1); //清洗成功上报;
			Record_Mode();        //判断上次工作状态
		}  
		report_time = (30*60 - Clear_tick);  //计算剩余时间
	mcu_dp_value_update(DPID_CLEAN_TIME_LEFT,report_time); //VALUE型数据上报;当前清洗模式运行剩余时间
}


u8 Storage_mode;
static u8 Storage_flag=0;
u8 timer_day_flag = 0;
/************************************************************
//	*	函数名称： PUMP_Waterpur()
//	* 功能    ： 净水单独工作模式
//	*	参数    ： 无
//	*	返回值  :  无
************************************************************/
void PUMP_Waterpur(void)   //净水模块单独
{
//	Storage_mode = _Mode;   //存储上次工作模式
	/**************判断时间有没有到 3点********************/
		RTC_TIME_T TimeStruct ;
		RTC_ReadTime(RTC_FORMAT_BIN, &TimeStruct);
	if(TimeStruct.hours >= 3 && TimeStruct.hours <=5)    //判断是不是凌晨3点
		Storage_flag = 1;
	else 
	{
		Storage_flag = 0;
		timer_day_flag = 0;
	}
}



/**********************切换模式********************************/
void pump_key_mode(void)  //切换模式
{
			if(key_mach_flag == interval_Mode)      //判断一下标志位
			{
				PUPM_interval(1,5);      //间歇模式	
				printf("jian\r\n");
			}
			else if(key_mach_flag == continuity_Mode)
			{	
				PUMP_continuity();		//持续出水模式
				Pump_tick = 0;			//清除间歇模式计时
				PUMP_MOTOR_flag = 0;  //间歇模式标志位
				printf("continue\r\n");
			}
			else if(key_mach_flag ==clear_Mode)             //进入清洗模式
			{
				Pump_tick = 0;			//清除间歇模式计时
				Pump_clear(30);  	 //清洗模式 30分钟
			}
			else
			{
					Clear_tick = 0;    //清除清洗模式计时
					PUMP_MOTOR(0);
					PUMP_WATERPUR(0);
			}			
		if(Key_WIFI_flag == 1)    //如果WIFI重置标志位等于 1 就重置WIFI
		{
			Key_WIFI_flag = 0;
			mcu_reset_wifi();    //重置wifi
		}
}




void Pure_water_Cheek(void)
{
if(Storage_flag == 0)        //净水模块标志位
	{
		PUMP_WATERPUR(0);   		//净水关
		pump_key_mode();      //进入其他模式
	}
	else                    //进入净水模式
	{
		PUMP_WATERPUR(1);  //净水开
		PUMP_continuity(); //连续出水模式
		PUMP_MOTOR_flag = 0;  //间歇模式标志位
		printf("jingshui\r\n");
	}

}



/************** 判断是开机或者关机状态************************/
void Key_ON_OFF_Mode(void)  
{
		if(Key_mach()==ON_state)    //开机状态要做的事
		{
			LED_Control(1);             //开灯
			Pure_water_Cheek();           // 判断进入那个模式
		}
		else                       //关机状态要做的事
		{				
			PUMP_OFF();               //水泵关 
			Pump_tick = 0;           //清除间歇模式计时
			PUMP_MOTOR_flag = 0;  	//间歇模式标志位
			Clear_tick = 0;          //清除清洗模式计时 
			LED_Control(0);                    //关灯
			printf("OFF_state\r\n");		
		}
}



/***********************水泵是缺水或者堵转状态*********************************/
void Check_Pump_Water_state(void)
{
	if(pump_stop_flag == 0)         //检测水泵是缺水或者堵转状态
	{
		Key_ON_OFF_Mode();           //无缺水状态  就 判断是开机或者关机状态
	}
	else
	{
		PUMP_stop();               //有就停止
		LED_Blink();
		Red_Blink();
	}

}






u8 filter_time = 30;
u8 Pure_time =30;
u8 Clear_time_report =30;
void timer_day_report(void)/*************上报剩余天数*********************/
{
	if(timer_day_flag == 1)
	{
		mcu_dp_value_update(DPID_FILTER_REMAIN_TIME,filter_time); //VALUE型数据上报;         //1
		mcu_dp_value_update(DPID_PURE_TIME_STILL,Pure_time); //VALUE型数据上报;               //0
		mcu_dp_value_update(DPID_CLEAR_REMAIN_TIME,Clear_time_report); //VALUE型数据上报;   //2
	}
	if(filter_time <= 0)
	{
		mcu_dp_value_update(DPID_FILTER_REMAIN_TIME,0); //VALUE型数据上报;         //1
		mcu_dp_value_update(DPID_PURE_TIME_STILL,Pure_time); //VALUE型数据上报;               //0
		mcu_dp_value_update(DPID_CLEAR_REMAIN_TIME,Clear_time_report); //VALUE型数据上报;   //2 
		mcu_dp_fault_update(DPID_EXPIRE_INFO,2); //故障型数据上报;  //1 
	}
	else if(Pure_time <= 0)
	{
		mcu_dp_value_update(DPID_FILTER_REMAIN_TIME,filter_time); //VALUE型数据上报;         //1
		mcu_dp_value_update(DPID_PURE_TIME_STILL,0); //VALUE型数据上报;               //0
		mcu_dp_value_update(DPID_CLEAR_REMAIN_TIME,Clear_time_report); //VALUE型数据上报;   //2
		mcu_dp_fault_update(DPID_EXPIRE_INFO,1); //故障型数据上报;
	}
	else if(Clear_time_report <= 0)
	{
		mcu_dp_value_update(DPID_FILTER_REMAIN_TIME,filter_time); //VALUE型数据上报;         //1
		mcu_dp_value_update(DPID_PURE_TIME_STILL,Pure_time); //VALUE型数据上报;               //0
		mcu_dp_value_update(DPID_CLEAR_REMAIN_TIME,0); //VALUE型数据上报;   //2
		mcu_dp_fault_update(DPID_EXPIRE_INFO,3); //故障型数据上报;
	}
	else
	{
		mcu_dp_value_update(DPID_FILTER_REMAIN_TIME,filter_time); //VALUE型数据上报;         //1
		mcu_dp_value_update(DPID_PURE_TIME_STILL,Pure_time); //VALUE型数据上报;               //0
		mcu_dp_value_update(DPID_CLEAR_REMAIN_TIME,Clear_time_report); //VALUE型数据上报;   //2
	}
	
	if(Storage_flag == 1)
	{
		if(timer_day_flag == 0)
		{
			filter_time--;
			Pure_time--;
			Clear_time_report--;
			timer_day_flag = 1;
		}
	}
}









